gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/example/tutorial/04_iseebrowser/main.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK 演示程序(ISee图象浏览器)
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//说明:不知大家是否还记得网上曾有个开源项目ISee图象浏览器,当初的目标
//		  是做个超越ACDSee的浏览器出来,后来由于种种原因,变成只提供图象
//		  编解码的项目,最后这个项目终止了。临风当时任这个项目的图象处理
//		  组的负责人,ISee项目的夭折是很可惜的,在这里我想把这个图象浏览
//		  器作为演示程序做出来,虽然比不上ACDSee,图象编解码的部分也没有
//		  使用这个项目的成果代码,但也算是表达一下对项目组成员的敬意,完
//		  成一个未了的心愿吧。
//
//本程序在上一个演示程序基础上演示:
//		创建XP样式的菜单
//		停靠工具栏
//		创建侧边栏
//		创建文件夹列表树
//		ListView控件使用演示
//		帮助信息对话框演示
//
**********************************************************************/
#include "global.h"

//消息绑定
BEGIN_REGMAINMSG
	REGCMD(CM_OPEN,OnOpen)
	REGCMD(CM_EXIT,OnExit)
	REGCMD(CM_ABOUT,OnHelp)
	//OnCascadeChild,OnTileChildH,OnTileChildV均为父类RingMDIFrameWnd成员函数
	REGCMD(CM_CASCADE,OnCascadeChild)	
	REGCMD(CM_TILEH,OnTileChildH)
	REGCMD(CM_TILEV,OnTileChildV)
	REGNOTIFY(TVN_SELCHANGED)
	REGNOTIFY(NM_DBLCLK)
	REGMSG(WM_MENUSELECT)
	REGMSG(WM_DESTROY)	
	REGMSG(WM_CREATE)	
END_REGMSG

int RingMain()
{
	RingApp.SetAccelTable(MAKEINTRESOURCE(IDR_ACCEL));
	APP_CREATEWINDOW("Isee浏览器[演示版本]","RingSDKApp4",WS_OVERLAPPEDWINDOW,MAKEINTRESOURCE(IDR_MAINMENU));
	return RingApp.Run();
}

RINGMAINMSG(WM_CREATE)
{
	//设定支持的图象格式,目前支持以下四种格式。BMP为默认,不需要设定。
	DIBREGFORMAT(GIF);
	DIBREGFORMAT(JPG);
	DIBREGFORMAT(PNG);
	DIBREGFORMAT(PCX);

	SetIcon(LoadIcon(GetInstance(),MAKEINTRESOURCE(IDI_APP)));
	
	//设置XP样式菜单
	InstallXPMenu();

	//创建工具栏对象,NewRingObj产生的控件及MDI子窗口对象只要产生窗口(调用Create或Attach)均自动释放,
	//因此如果以后不再使用,其对象指针可以采用临时变量。
	//NewRingObj的参数请使用itemof(控件类名)
	RingToolBar *toolbar = NewRingObj(itemof(RingToolBar));
	toolbar->Create(IDB_TOOLBAR,TBSTYLE_FLAT);
	//创建按钮,参数:按钮序号,按钮图象在工具栏图象中序号,命令号
	toolbar->InsertButton(0,1,CM_OPEN);
	toolbar->InsertSep(1);
	toolbar->InsertButton(2,11,CM_ABOUT);
	toolbar->EnableDock("工具栏");
	
	//创建文件夹列表树
	m_dirtree = NewRingObj(itemof(RingDirTree));
	m_dirtree->Create(IDC_FOLDERTREE);
	m_dirtree->ListDir();
	
	//创建侧边栏
	m_dirtree->EnableDockSize("文件夹",200,400,TBS_FLAG_DOCKLEFT,TBS_EX_NONE);	

	//创建文件列表栏
	m_fileview = NewRingObj(itemof(RingListView));
	m_fileview->Create(LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS,WS_EX_CLIENTEDGE,NULL,IDC_FILEVIEW,0,0,300,300);
	m_fileview->SetExStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_fileview->SetColumns("名称|大小|修改时间");
	m_fileview->SetColumnsWidth("300|180|230");
	m_fileview->EnableDockSize("文件列表",300,200,TBS_FLAG_DOCKBOTTOM,TBS_EX_NONE);
	//创建状态栏
	m_statbar = NewRingObj(itemof(RingStatusBar));
	m_statbar->Create();
	
	return DefaultProc(param);
}

RINGMAINMSG(WM_MENUSELECT)
{
	//在状态栏显示菜单帮助信息,资源字符串ID规则:菜单项资源字符串ID必须=该菜单项命令ID,
	//子菜单资源字符串ID必须=0x1100+子菜单序号(从0开始计算)
	UINT uIds[] = {MH_BASE,MH_POPUPBASE,0,0};
	MenuHelp(WM_MENUSELECT,param.wParam,param.lParam,GetMenu(),GetInstance(),m_statbar->Handle(),uIds);
	return 0;
}

RINGMAINNOTIFY(TVN_SELCHANGED)
{
	//用户选择目录的处理,先交由控件响应
	m_dirtree->OnSelectChanged(param);

	//获取选择的目录后列出图象文件
	ringDir dir(m_dirtree->GetSelFolderName());
	ringFile rf;
	ringStr str;
	char szFile[MAX_PATH];
	int index;
	HICON hicon;

	if(IsWindowPtr(m_fileview))		//检测m_fileview是否有效及已创建
		m_fileview->Clear();

	if(dir.BeginFindFile())
	{
		while(dir.FindNext(szFile))
		{
			rf.SetFile("%s\\%s",dir.Getdir(),szFile);
			str = rf.Extname();
			str.toLower();
			if(str == "bmp" || str == "jpg" || str == "jpeg" || str == "gif" || 
				str == "pcx" || str == "png")
			{				
				index = m_fileview->GetCount();
				hicon = ExtractIcon(GetInstance(),rf.Fullname(),0);
				m_fileview->AddItem(index,rf.Filename(),(LPARAM)hicon,m_fileview->AddIcon(hicon));
				m_fileview->SetItem(index,1,rf.Size());
			}
		}
	}

	return 0;
}

RINGMAINNOTIFY(NM_DBLCLK)
{
	if(param.lpnmhdr->hwndFrom == m_fileview->Handle())
	{
		char szFile[MAX_PATH];
		LPNMITEMACTIVATE lpv = (LPNMITEMACTIVATE)param.lParam;
		wsprintf(szFile,"%s\\%s\0",m_dirtree->GetSelFolderName(),m_fileview->GetText(lpv->iItem,0));
		
		HWND hChild = FindWindowEx(GetClient(),NULL,GetChildClassName(),szFile);
		if(hChild)
			ActiveChild(hChild);
		else
			CreateChild(szFile,NewRingObj(child),TRUE,WS_OVERLAPPEDWINDOW);
	}
	return 0;
}

RINGMAINMSG(WM_DESTROY)
{
	//主窗口关闭时的清理代码,本程序不需要清理,仅退出即可。
	//如果响应本消息,必须在最后调用Quit(),即PostQuitMessage,
	//否则窗口销毁,但程序仍滞留内存。
	return Quit();	
}

RINGMAINCMD(OnOpen)
{
	ringFile rf;
	if(rf.Select("图象文件|*.bmp;*.gif;*.jpg;*.jpeg;*.png;*.pcx||"))
		CreateChild(rf.Fullname(),NewRingObj(child),TRUE,WS_OVERLAPPEDWINDOW);	
}

RINGMAINCMD(OnExit)
{
	SendExit();
}

RINGMAINCMD(OnHelp)
{
	//对话框的最简单用法,如果对话框只是显示版权信息,不需要与用户交互,
	//就可以这样使用,用对话框资源ID作为参数调用复制构造函数即可。
	RingDialog(IDD_ABOUT).DoModal();
}